package com.lg.concurrent;

import lombok.ToString;

import java.util.concurrent.TimeUnit;

public class ThreadLocalTest {
    @ToString
    static class Person{
        String name;

        Person(String name) {
            this.name = name;
        }

    }



    static ThreadLocal<Person> tl = new ThreadLocal<>();

    public static void main(String[] args) {
        tl.get();
        tl.remove();

        helloThreadLocal();
    }

    public static void helloThreadLocal() {


        new Thread(()->{
            Person aa = new Person("aa");
            /**
             * 得到当前线程的 threadLocals 他是一个map，如果当前线程没有，那么就去创建一个
             * 将tl,value 放入这个map，但是tl使用的是一个弱引用指向的
             * 为什么使用弱引用
             * 如果是强引用，那么这个当我不想用的时候，只把外面tl置为null是不行的，在这个map中还是强引用，还是回收不了。
             * map是跟thread共生的，索引只有这个线程死了，存的这些东西才有可能被回收。
             * 当使用的是弱引用的时候，只需要把外边的强引用置为null，里面的弱引用在任何一次gc的时候都会被回收。
             *
             * get set remove 的时候都会删除空的value
             */
            tl.set(aa);
            try {
                System.out.println("1 set over ,start to sleep");
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("1 sleep over");
            System.out.println("1 "+tl.get());
        }).start();

        new Thread(()->{
            System.out.println("2 "+tl.get());
        }).start();


    }
}
